package br.fatec.model.dao;

import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.List;

import br.fatec.model.entity.Produto;
import br.fatec.util.Globals;
import br.fatec.util.Persistencia;
import br.fatec.util.Validacoes;

public class ProdutoDao {
	private Persistencia persis;

	public ProdutoDao() {
		Globals globals = Globals.getInstance();

		this.persis = globals.getPersistencia();
	}

	public void cadastrar(Produto produto) throws Exception {
		persis.cadastrar(produto);
	}

	public void alterar(Produto produto) throws Exception {
		persis.alterar(produto);
	}

	public void excluir(Produto produto) throws Exception {
		persis.excluir(produto.getClass(), produto.getCodigo());
	}

	public void desativar(Produto produto) throws Exception {
		produto = consultar(produto.getCodigo());

		produto.setAtivo(false);

		persis.alterar(produto);
	}

	public Produto consultar(Integer codigo) throws Exception {
		String query = "select * from produto where codigo = :codigo and ativo = :ativo";
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("codigo", codigo);
		parametros.put("ativo", true);

		return (Produto) persis.consultar(Produto.class, query, parametros);
	}

	@SuppressWarnings("unchecked")
	public List<Produto> listar() throws Exception {
		String query = "select * from produto where ativo = :ativo order by codigo asc";

		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("ativo", true);
		
		return (List<Produto>) persis.listar(Produto.class, query, parametros);
	}

	@SuppressWarnings("unchecked")
	public List<Produto> listar(String nome) throws Exception {
		String query = "select * from produto where nome ilike :nome and ativo = :ativo order by codigo asc";
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("nome", "%" +nome+"%");
		parametros.put("ativo", true);

		return (List<Produto>) persis.listar(Produto.class, query, parametros);
	}

	@SuppressWarnings("unchecked")
	public List<Produto> filtrar(String codigo, String nome, String descricao,
			String valorUnitario) throws Exception {
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("ativo", true);
		
		String query = "select * from produto where ativo = :ativo";

		if (codigo != null && !codigo.isEmpty())
		{
			query += " and cast(codigo as varchar(50)) ilike :codigo";
			parametros.put("codigo", "%" +codigo+"%");
		}

		if (nome != null && !nome.isEmpty())
		{
			query += " and nome ilike :nome";
			parametros.put("nome", "%" +nome+"%");
		}
		
		if (descricao != null && !descricao.isEmpty())
		{
			query += " and descricao ilike :descricao";
			parametros.put("descricao", "%" +descricao+"%");
		}
		
		if (valorUnitario != null && !valorUnitario.isEmpty())
		{
			if(Validacoes.isNumeric(valorUnitario.replace(",", ".")))
			{
				valorUnitario = new DecimalFormat("0.00").format(Double.parseDouble(valorUnitario.replace(",", ".")));
			}
			
			query += " and cast(valor_unitario as varchar(50)) ilike :valor_unitario";
			parametros.put("valor_unitario", "%" +valorUnitario.replace(",", ".") +"%");
		}

		query += " order by produto.codigo asc";

		return (List<Produto>) persis.listar(Produto.class, query, parametros);
	}
}
